#pragma once

#include <string>

/**
 * 目前在模板中暂时使用 按值传递 参数，原因如下：
 *      模板可能同时用于简单类型和复杂类型，因此为复杂类型选择这种方法时，可能会对简单类型产生反效果。
 *      作为调用者，可以通过引用来传递参数，可以使用 std::ref() 和 std::cref()
 *      虽然传递字符串字面值或原始数组可能会产生问题，但通过引用传递通常会有更多的问题
 *      移动语义可以减少按值传递带来的复制开销
 */

template<typename T>
T max(T a,T b){
    std::cout << "max<T>"<< std::endl;
    return a>b?a:b;
}

template<typename T>
T max(T a,T b,T c){
    return max(max(a,b),c); // 调用了max<T> 而不是下面的max，这点会在后面解释
}

int max(int a,int b){
    return a>b?a:b;
}

// 模板的默认参数
template<typename T=std::string>
void defaultParam(T t = ""){
    std::cout << "default_val: "<< t  << std::endl;
}
// defaultParam(); // out: default_val: 
// defaultParam(20);  // out: default_val: 20